#include "SQLEvalVisitorImpl.h"

SQLEvalVisitorImpl::SQLEvalVisitorImpl() : variantIndex(-1), markVariantIndex(BOOL::TRUE)
{
  Object_list_ptr tmp = std::make_shared<std::list<Object_ptr>>();
  int i = 1;
  Object_ptr tmpObject = Object_ptr(new Object());
  tmpObject->any_data_ = i;
  tmp->push_back(tmpObject);
  // parameters = std::make_shared<std::list<Object_ptr >> ();
  this->parameters = tmp;
}

SQLEvalVisitorImpl::SQLEvalVisitorImpl(Object_list_ptr parameters)
    : variantIndex(-1),
      markVariantIndex(BOOL::TRUE)
{
  // parameters = std::make_shared<std::list<Object_ptr >> ();
  this->parameters = parameters;
}

Object_list_ptr SQLEvalVisitorImpl::getParameters()
{
  return parameters;
}

void SQLEvalVisitorImpl::setParameters(Object_list_ptr parameters)
{
  this->parameters = parameters;
}

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLCharExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

int SQLEvalVisitorImpl::incrementAndGetVariantIndex()
{
  return ++variantIndex;
}

int SQLEvalVisitorImpl::getVariantIndex()
{
  return variantIndex;
}

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLVariantRefExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLBinaryOpExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLIntegerExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLNumberExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLHexExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLCaseExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLInListExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLNullExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLMethodInvokeExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLQueryExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

bool SQLEvalVisitorImpl::isMarkVariantIndex()
{
  return markVariantIndex;
}

void SQLEvalVisitorImpl::setMarkVariantIndex(bool markVariantIndex)
{
  this->markVariantIndex = markVariantIndex;
}

SQLFunction* SQLEvalVisitorImpl::getFunction(std::string funcName)
{
  auto it = functions.find(funcName);
  if (it != functions.end())
  {
    return it->second;
  }
  else
  {
    return nullptr;
  }
}

void SQLEvalVisitorImpl::registerFunction(std::string funcName, SQLFunction* function)
{
  functions.insert(std::make_pair(funcName, function));
}

// BOOL_ptr SQLEvalVisitorImpl::visit(SQLIdentifierExpr *x) {
// 	return SQLEvalVisitorUtils.visit(this, x);
// }

void SQLEvalVisitorImpl::unregisterFunction(std::string funcName)
{
  	functions.erase(funcName);
}
